package compile;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
// 1. 通过 Runtime 获取到 Runtime 对象, 这是一个单例对象.然后 exec 得到 Process 对象
// 2. 对标准输出进行重定向.
// 3. 对标准错误进行重定向
// 4. 等待程序结束.
/**
 * Description:
 * Date:2025-06-16
 * Time:14:37
 */
public class CommandUtil {
    public static int run(String cmd,String stdoutFile,String stderrFile) {
        try {
            // 1. 通过 Runtime 获取到 Runtime 对象, 这是一个单例对象.
            //然后 exec 得到 Process 对象
            Process process = Runtime.getRuntime().exec(cmd);
            // 2. 对标准输出进行重定向.
            if (stdoutFile != null) {
                InputStream stdoutFrom = process.getInputStream();
                FileOutputStream stdoutTo = new FileOutputStream(stdoutFile);
                while (true) {
                    int ch = stdoutFrom.read();
                    if (ch == -1) {
                        break;
                    }
                    stdoutTo.write(ch);
                }
                stdoutFrom.close();
                stdoutTo.close();
            }
            // 3. 对标准错误进行重定向
            if (stderrFile != null) {
                InputStream stderrFrom = process.getErrorStream();
                FileOutputStream stderrTo = new FileOutputStream(stderrFile);
                while (true) {
                    int ch = stderrFrom.read();
                    if (ch == -1) {
                        break;
                    }
                    stderrTo.write(ch);
                }
                stderrFrom.close();
                stderrTo.close();
            }
            // 4. 等待程序结束.
            int exitCode = process.waitFor();
            return exitCode;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return 1;
    }

    public static void main(String[] args) {
        CommandUtil.run("javac", "stdout.txt", "stderr.txt");
    }
}
